﻿////------------------------------------------------------------------------------
////此代码版权声明为全文件覆盖，如有原作者特别声明，会在下方手动补充
//// 此代码版权（除特别声明外的代码）归作者本人Diego所有
//// 源代码使用协议遵循本仓库的开源协议及附加协议
//// Gitee源代码仓库：https://gitee.com/diego2098/ThingsGateway
//// Github源代码仓库：https://github.com/kimdiego2098/ThingsGateway
//// 使用文档：https://thingsgateway.cn/
//// QQ群：605534569
//// ------------------------------------------------------------------------------

using System.Dynamic;

using ThingsGateway.Foundation;
using ThingsGateway.Gateway.Application;
public class TestDynamicModel : IDynamicModel
{
    public IEnumerable<dynamic> GetList(IEnumerable<object> datas)
    {
        if (datas == null) return null;
        List<ExpandoObject> deviceObjs = new List<ExpandoObject>();
        //按设备名称分组
        var groups = datas.Where(a => !string.IsNullOrEmpty(((AlarmVariable)a).DeviceName)).GroupBy(a => ((AlarmVariable)a).DeviceName, a => ((AlarmVariable)a));
        foreach (var group in groups)
        {
            //按采集时间分组
            var data = group.GroupBy(a => a.AlarmTime.DateTimeToUnixTimestamp());
            var deviceObj = new ExpandoObject();
            List<ExpandoObject> expandos = new List<ExpandoObject>();
            foreach (var item in data)
            {
                var expando = new ExpandoObject();
                expando.TryAdd("ts", item.Key);
                var variableObj = new ExpandoObject();
                foreach (var tag in item)
                {
                    var alarmObj = new ExpandoObject();
                    alarmObj.TryAdd(nameof(tag.AlarmCode), tag.AlarmCode);
                    alarmObj.TryAdd(nameof(tag.AlarmText), tag.AlarmText);
                    alarmObj.TryAdd(nameof(tag.AlarmType), tag.AlarmType);
                    alarmObj.TryAdd(nameof(tag.AlarmLimit), tag.AlarmLimit);
                    alarmObj.TryAdd(nameof(tag.EventTime), tag.EventTime);
                    alarmObj.TryAdd(nameof(tag.EventType), tag.EventType);

                    variableObj.TryAdd(tag.Name, alarmObj);
                }
                expando.TryAdd("alarms", variableObj);

                expandos.Add(expando);
            }
            deviceObj.TryAdd(group.Key, expandos);
            deviceObjs.Add(deviceObj);
        }

        return deviceObjs;
    }
}